﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FundamentalsOfCompiling
{
    class treeNode
    {
        public static int MAXCHILDREN = 3;
        public treeNode[] child = new treeNode[MAXCHILDREN];		/* 子节点指针	*/
        public treeNode sibling;					/* 兄弟节点指针	*/
        public int lineno;								/* 源代码行号	*/
        public NodeKind nodekind;						    /* 节点类型		*/
        public union kind;                    /* 具体类型     */
        public ATTR attr;
        public int idnum = 0;                    /* 相同类型的变量个数 */
        public string[] name = new string[10];            /* 标识符的名称  */
        //struct symbtable * table[10]; /* 与标志符对应的符号表地址，在语义分析阶段填入*/ 
        public treeNode()
        {
            kind = new union();
        }
    };

    class union
    {
        public DecKind dec;
        public StmtKind stmt;
        public ExpKind exp;
        public union() { }
    };

    struct ATTR
    {
        public ArrayAttrD ArrayAttr;
        public ProcAttrD ProcAttr;
        public ExpAttrD ExpAttr;
        public string type_name;             /* 类型名是标识符  */
    };                          /* 属性	       */

    /* 数组属性     */
    struct ArrayAttrD
    {
        public int low;              /* 数组下界     */
        public int up;               /* 数组上界     */
        public DecKind childtype;  /* 数组的子类型 */
    };

    struct ProcAttrD
    {
        public ParamType paramt;     /* 过程的参数类型*/
    };                 /* 过程属性      */

    struct ExpAttrD
    {
        public LexType op;           /* 表达式的操作符*/
        public int val;		      /* 表达式的值	   */
        public VarKind varkind;     /* 变量的类别    */
      ///  public ExpType type;         /* 用于类型检查  */
    };	              /* 表达式属性    */

}

